package com.cy.guava;


import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.Multimap;
import org.testng.annotations.Test;

/***
 * Multimap提供了丰富的实现，所以你可以用它来替代程序里的Map<K, Collection<V>>，具体的实现如下：
 * 　　Implementation            Keys 的行为类似       　　　Values的行为类似
 *
 * 　　ArrayListMultimap         HashMap                   　　ArrayList
 *
 * 　　HashMultimap               HashMap                  　　 HashSet
 *
 * 　　LinkedListMultimap        LinkedHashMap*              LinkedList*
 *
 * 　　LinkedHashMultimap      LinkedHashMap                LinkedHashSet
 *
 * 　　TreeMultimap                TreeMap                          TreeSet
 *
 * 　　ImmutableListMultimap  ImmutableMap                 ImmutableList
 *
 * 　　ImmutableSetMultimap  ImmutableMap                 ImmutableSet　　
 *
 * 　　以上这些实现，除了immutable的实现都支持null的键和值。
 * 　　1、LinkedListMultimap.entries()能维持迭代时的顺序。
 * 　　2、LinkedHashMultimap维持插入的顺序，以及键的插入顺序。
 */
public class DemoWithMultimap {

	@Test
	public void t1(){
		Multimap<String,String> multimap = ArrayListMultimap.create();
		multimap.put("lower", "a");
		multimap.put("lower", "b");
		multimap.put("lower", "c");

		multimap.put("upper", "A");
		multimap.put("upper", "B");

		System.out.println(multimap.get("lower"));
		System.out.println(multimap.asMap());
		System.out.println(multimap.keySet());
		System.out.println(multimap.values());
	}

	@Test
	public void t2(){
		Multimap<String,String> oldMap = ArrayListMultimap.create();
		oldMap.put("lower", "a");
		oldMap.put("lower", "b");
		oldMap.put("lower", "c");
		oldMap.put("upper", "A");
		oldMap.put("upper", "B");
		System.out.println(oldMap);
		ImmutableListMultimap<String, String> newMap = ImmutableListMultimap.copyOf(oldMap);
		System.out.println(newMap);
		oldMap.put("upper", "C");
		System.out.println(oldMap);
		System.out.println(newMap);
	}
}
